package controller

import (
	"awesomeProject/goprpoject/test11/model"
	"awesomeProject/goprpoject/test11/response"
	"awesomeProject/goprpoject/test11/respository"
	"awesomeProject/goprpoject/test11/vo"
	"strconv"

	"github.com/gin-gonic/gin"
)

type ICategoryController interface {
	// 	Create(ctx *gin.Context)
	// 	UpdatedAt(ctx *gin.Context)
	// 	Show(ctx *gin.Context)
	// 	Delete(ctx *gin.Context)
	ResController
}

type CategoryController struct {
	// DB *gorm.DB  优化前
	Repository respository.CategoryRepository // 优化后
}

func NewCategoryController() ICategoryController {
	// 优化前
	// db := common.GetBD()
	// db.AutoMigrate(model.Category{})
	// return CategoryController{DB: db}
	// 优化后
	respository := respository.NewCategoryRepository()
	respository.DB.AutoMigrate(model.Category{})
	return CategoryController{Repository: respository}

}

// 新增
func (c CategoryController) Create(ctx *gin.Context) {
	// var requestCategory model.Category
	// 优化前
	// 参数接收
	// ctx.Bind(&requestCategory)
	// // 参数检验
	// if requestCategory.Name == "" {
	// 	response.Fail(ctx, "数据验证错误 分类名必须填写", nil)
	// 	return
	// }

	// 优化后
	var reqeustCategory vo.CreateCategoryRequest
	if err := ctx.ShouldBind(&reqeustCategory); err != nil {
		response.Fail(ctx, "数据验证错误 分类名必须填写", nil)

		return
	}
	// 入库 // 优化前
	//category := model.Category{Name: reqeustCategory.Name} //  防止 Table 'develop_test.create_category_requests' doesn't exist 作为表
	//c.DB.Create(&category)
	// c.Repository.Create(category.Name)

	category, err := c.Repository.Create(reqeustCategory.Name)
	if err != nil {
		// response.Fail(ctx, "创建失败", nil)
		panic(err) // 在哪里拦截 panic
		return
	}

	// 返回

	response.Success(ctx, gin.H{"category": category}, "写入成功")
}

// 更新
func (c CategoryController) Update(ctx *gin.Context) {
	// var requestCategory model.Category
	// 更新绑定body中的参数

	// 参数接收
	// 优化前
	// ctx.Bind(&requestCategory)
	// // 参数检验 是否为空
	// if requestCategory.Name == "" {
	// 	response.Fail(ctx, "数据验证错误 分类名必须填写", nil)
	// 	return
	// }
	// 优化后
	// 绑定body 中的参数 类似form
	var requestCategory vo.CreateCategoryRequest
	if err := ctx.ShouldBind(&requestCategory); err != nil {
		response.Fail(ctx, "数据验证错误 分类名必须填写", nil)
		return
	}
	// 获取path中的参数
	// 优化前
	categoryId, _ := strconv.Atoi(ctx.Params.ByName("id"))

	// // 定义一个更新类
	// var updateCateGory model.Category
	// if c.DB.First(&updateCateGory, categoryId).RecordNotFound() {
	// 	response.Fail(ctx, "分类不存在", nil)
	// 	return
	// }
	// 更新入库
	// map 1
	// struct 2
	// name values3
	// 优化后
	updateCategory, err := c.Repository.SelecBytId(categoryId)
	if err != nil {
		response.Fail(ctx, "分类不存在", nil)
		return
	}
	// 更新 优化前
	category, err := c.Repository.Upate(*updateCategory, requestCategory.Name)
	//c.DB.Model(&updateCateGory).Update("name", requestCategory.Name)
	// 优化后
	// 返回
	response.Success(ctx, gin.H{"category": category}, "修改成功")

}

func (c CategoryController) Show(ctx *gin.Context) {

	// 获取path 参数
	// 优化前
	categoryId, _ := strconv.Atoi(ctx.Params.ByName("id"))
	// var category model.Category
	// if c.DB.First(&category, categoryId).RecordNotFound() {
	// 	response.Fail(ctx, "分类不存在", nil)
	// }c

	// 优化后 先调用查询接口
	category, err := c.Repository.SelecBytId(categoryId)
	if err != nil {
		response.Fail(ctx, "分类不存在", nil)
		return
	}
	response.Success(ctx, gin.H{"category": category}, "查询成功")
}

// 删除
func (c CategoryController) Delete(ctx *gin.Context) {
	// 获取path 参数
	// categoryId, _ := strconv.Atoi(ctx.Params.ByName("id"))
	// var category model.Category
	// // 查询
	// if c.DB.First(&category, categoryId).RecordNotFound() {
	// 	response.Fail(ctx, "分类不存在", nil)
	// 	return
	// }

	// //	 if err := c.DB.Delete(model.Category{}, categoryId); err != nil {
	// // 	response.Fail(ctx, "删除失败 请重试", nil)
	// // 	return

	// // }
	// // 带上其它条件
	// c.DB.Where("Id = ?", categoryId).Delete(&category)
	// response.Success(ctx, nil, "删除成功")

	// path 参数
	// 优化前
	categoryId, _ := strconv.Atoi(ctx.Params.ByName("id"))
	// if err := c.DB.Delete(model.Category{}, categoryId).Error; err != nil {
	// 	response.Fail(ctx, "删除失败 请重试", nil)
	// 	return
	// }

	// 优化后
	err := c.Repository.DeleteByID(categoryId)
	if err != nil {
		response.Fail(ctx, "删除失败 请重试", nil)
		return
	}

	response.Success(ctx, gin.H{"categotyID": categoryId}, "删除成功")
}
